<!doctype html>
<html lang="zh-cn">
  <head>
    <title>正则表达式 // JW Blog</title>
    <meta charset="utf-8" />
    <meta name="generator" content="Hugo 0.60.1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="John Doe" />
    <meta name="description" content="" />
    <link rel="stylesheet" href="https://duyi111.gitee.io/css/main.min.f90f5edd436ec7b74ad05479a05705770306911f721193e7845948fb07fe1335.css" />

    
    <meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="正则表达式"/>
<meta name="twitter:description" content="1.正则表达式的概述 1.1正则表达式的介绍  在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要，比如:邮箱、图片地址、手机号码等，这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。  1.2 正则表达式的概念  正则表达式就是记录文本规则的代码  1.3 正则表达式的特点  正则表达式的语法很令人头疼，可读性差 正则表达式通用性很强，能够适用于很多编程语言  1.4 小结  正则表达式是匹配符合某些规则的字符串数据  2.re模块的介绍 2.1 re模块的介绍和使用  在python中需要通过正则表达式对字符串进行匹配的时候，可以使用一个re模块 # 导入re模块 import re # 使用match方法进行匹配操作 result = re.match(正则表达式，要匹配的字符串) # 如果上一步匹配到数据的话，可以使用group方法来提取数据 result.group()   2.2 小结  re.match()根据正则表达式从头开始匹配字符串数据  3.匹配单个字符 3.1 匹配单个字符   .：表示匹配任意一个字符（除了\n） []：表示匹配[]中列举的一个字符 \d：表示匹配一个数字，即0-9 \D：表示匹配一个非数字，即不是数字 \s：表示匹配一个空白字符，即空格，tab键 \S：表示匹配一个非空白字符 \w：表示匹配一个非特殊字符，即a-z、A-Z、0-9、_、汉字 \W：表示匹配一个特殊字符，即非字母、非数字、非汉字  3.2 示例  示例1：. import re ret = re.match(&quot;.&quot;,&quot;M&quot;) print(ret.group()) ret = re."/>

    <meta property="og:title" content="正则表达式" />
<meta property="og:description" content="1.正则表达式的概述 1.1正则表达式的介绍  在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要，比如:邮箱、图片地址、手机号码等，这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。  1.2 正则表达式的概念  正则表达式就是记录文本规则的代码  1.3 正则表达式的特点  正则表达式的语法很令人头疼，可读性差 正则表达式通用性很强，能够适用于很多编程语言  1.4 小结  正则表达式是匹配符合某些规则的字符串数据  2.re模块的介绍 2.1 re模块的介绍和使用  在python中需要通过正则表达式对字符串进行匹配的时候，可以使用一个re模块 # 导入re模块 import re # 使用match方法进行匹配操作 result = re.match(正则表达式，要匹配的字符串) # 如果上一步匹配到数据的话，可以使用group方法来提取数据 result.group()   2.2 小结  re.match()根据正则表达式从头开始匹配字符串数据  3.匹配单个字符 3.1 匹配单个字符   .：表示匹配任意一个字符（除了\n） []：表示匹配[]中列举的一个字符 \d：表示匹配一个数字，即0-9 \D：表示匹配一个非数字，即不是数字 \s：表示匹配一个空白字符，即空格，tab键 \S：表示匹配一个非空白字符 \w：表示匹配一个非特殊字符，即a-z、A-Z、0-9、_、汉字 \W：表示匹配一个特殊字符，即非字母、非数字、非汉字  3.2 示例  示例1：. import re ret = re.match(&quot;.&quot;,&quot;M&quot;) print(ret.group()) ret = re." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://duyi111.gitee.io/post/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/" />
<meta property="article:published_time" content="2020-02-11T14:20:39+08:00" />
<meta property="article:modified_time" content="2020-02-11T14:20:39+08:00" />


  </head>
  <body>
    <header class="app-header">
      <a href="https://duyi111.gitee.io/"><img class="app-header-avatar" src="/avatar.jpg" alt="John Doe" /></a>
      <h1>JW Blog</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vehicula turpis sit amet elit pretium.</p>
      <div class="app-header-social">
        
      </div>
    </header>
    <main class="app-container">
      
  <article class="post">
    <header class="post-header">
      <h1 class ="post-title">正则表达式</h1>
      <div class="post-meta">
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
  <title>calendar</title>
  <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
          Feb 11, 2020
        </div>
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-clock">
  <title>clock</title>
  <circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
          3 min read
        </div></div>
    </header>
    <div class="post-content">
      <h2 id="1">1.正则表达式的概述</h2>
<h4 id="11">1.1正则表达式的介绍</h4>
<ul>
<li>在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要，比如:邮箱、图片地址、手机号码等，这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。</li>
</ul>
<h4 id="12-">1.2 正则表达式的概念</h4>
<ul>
<li>正则表达式就是记录文本规则的代码</li>
</ul>
<h4 id="13-">1.3 正则表达式的特点</h4>
<ul>
<li>正则表达式的语法很令人头疼，可读性差</li>
<li>正则表达式通用性很强，能够适用于很多编程语言</li>
</ul>
<h4 id="14-">1.4 小结</h4>
<ul>
<li>正则表达式是匹配符合某些规则的字符串数据</li>
</ul>
<h2 id="2re">2.re模块的介绍</h2>
<h4 id="21-re">2.1 re模块的介绍和使用</h4>
<ul>
<li>在python中需要通过正则表达式对字符串进行匹配的时候，可以使用一个re模块
<pre><code># 导入re模块
import re
  
# 使用match方法进行匹配操作
result = re.match(正则表达式，要匹配的字符串)
  
# 如果上一步匹配到数据的话，可以使用group方法来提取数据
result.group()
</code></pre></li>
</ul>
<h4 id="22-">2.2 小结</h4>
<ul>
<li><code>re.match()</code>根据正则表达式从头开始匹配字符串数据</li>
</ul>
<h2 id="3">3.匹配单个字符</h2>
<h4 id="31-">3.1 匹配单个字符</h4>
<ul>
<li><code> .</code>：表示匹配任意一个字符（除了<code>\n</code>）</li>
<li><code>[]</code>：表示匹配<code>[]</code>中列举的一个字符</li>
<li><code>\d</code>：表示匹配一个数字，即0-9</li>
<li><code>\D</code>：表示匹配一个非数字，即不是数字</li>
<li><code>\s</code>：表示匹配一个空白字符，即空格，tab键</li>
<li><code>\S</code>：表示匹配一个非空白字符</li>
<li><code>\w</code>：表示匹配一个非特殊字符，即a-z、A-Z、0-9、_、汉字</li>
<li><code>\W</code>：表示匹配一个特殊字符，即非字母、非数字、非汉字</li>
</ul>
<h4 id="32-">3.2 示例</h4>
<ul>
<li>示例1：<code>.</code>
<pre><code>import re

ret = re.match(&quot;.&quot;,&quot;M&quot;)
print(ret.group())

ret = re.match(&quot;t.o&quot;,&quot;too&quot;)
print(ret.group())

ret = re.match(&quot;t.o&quot;,&quot;two&quot;)
print(ret.group())
  
  
# 运行结果：
M
too
two
</code></pre></li>
<li>示例2：<code>[]</code>
<pre><code>import re

# 如果hello的首字符小写，那么正则表达式需要小写的h
ret = re.match(&quot;h&quot;,&quot;hello Python&quot;) 
print(ret.group())


# 如果hello的首字符大写，那么正则表达式需要大写的H
ret = re.match(&quot;H&quot;,&quot;Hello Python&quot;) 
print(ret.group())

# 大小写h都可以的情况
ret = re.match(&quot;[hH]&quot;,&quot;hello Python&quot;)
print(ret.group())
ret = re.match(&quot;[hH]&quot;,&quot;Hello Python&quot;)
print(ret.group())
ret = re.match(&quot;[hH]ello Python&quot;,&quot;Hello Python&quot;)
print(ret.group())

# 匹配0到9第一种写法
ret = re.match(&quot;[0123456789]Hello Python&quot;,&quot;7Hello Python&quot;)
print(ret.group())

# 匹配0到9第二种写法
ret = re.match(&quot;[0-9]Hello Python&quot;,&quot;7Hello Python&quot;)
print(ret.group())

ret = re.match(&quot;[0-35-9]Hello Python&quot;,&quot;7Hello Python&quot;)
print(ret.group())

# 下面这个正则不能够匹配到数字4，因此ret为None
ret = re.match(&quot;[0-35-9]Hello Python&quot;,&quot;4Hello Python&quot;)
# print(ret.group())
  
# 运行结果：
h
H
h
H
Hello Python
7Hello Python
7Hello Python
7Hello Python
</code></pre></li>
<li>示例3：<code>\d</code>
<pre><code>import re

# 普通的匹配方式
ret = re.match(&quot;嫦娥1号&quot;,&quot;嫦娥1号发射成功&quot;) 
print(ret.group())

ret = re.match(&quot;嫦娥2号&quot;,&quot;嫦娥2号发射成功&quot;) 
print(ret.group())

ret = re.match(&quot;嫦娥3号&quot;,&quot;嫦娥3号发射成功&quot;) 
print(ret.group())

# 使用\d进行匹配
ret = re.match(&quot;嫦娥\d号&quot;,&quot;嫦娥1号发射成功&quot;) 
print(ret.group())

ret = re.match(&quot;嫦娥\d号&quot;,&quot;嫦娥2号发射成功&quot;) 
print(ret.group())

ret = re.match(&quot;嫦娥\d号&quot;,&quot;嫦娥3号发射成功&quot;) 
print(ret.group())
  
# 运行结果：
嫦娥1号
嫦娥2号
嫦娥3号
嫦娥1号
嫦娥2号
嫦娥3号
</code></pre></li>
<li>示例4：<code>\D</code>
<pre><code>import re

match_obj = re.match(&quot;\D&quot;, &quot;f&quot;)
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
  
# 运行结果：
f
</code></pre></li>
<li>示例5：<code>\s</code>
<pre><code>import re

# 空格属于空白字符
match_obj = re.match(&quot;hello\sworld&quot;, &quot;hello world&quot;)
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print(&quot;匹配失败&quot;)



# \t 属于空白字符
match_obj = re.match(&quot;hello\sworld&quot;, &quot;hello\tworld&quot;)
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
hello world
hello world
</code></pre></li>
<li>示例6：<code>\S</code>
<pre><code>import re

match_obj = re.match(&quot;hello\Sworld&quot;, &quot;hello&amp;world&quot;)
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print(&quot;匹配失败&quot;)



match_obj = re.match(&quot;hello\Sworld&quot;, &quot;hello$world&quot;)
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
hello&amp;world  
hello$world
</code></pre></li>
<li>示例7：<code>\w</code>
<pre><code>import re

# 匹配非特殊字符中的一位
match_obj = re.match(&quot;\w&quot;, &quot;A&quot;)
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
A
</code></pre></li>
<li>示例8：<code>\W</code>
<pre><code># 匹配特殊字符中的一位
match_obj = re.match(&quot;\W&quot;, &quot;&amp;&quot;)
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
&amp;
</code></pre></li>
</ul>
<h2 id="4">4.匹配多个字符</h2>
<h4 id="41-">4.1 匹配多个字符</h4>
<ul>
<li><code>*</code>:表示匹配前一个字符出现0次或者无限次，即可有可无</li>
<li><code>+</code>：表示匹配前一个字符出现1次或者无限次，即至少有1次</li>
<li><code>？</code>：表示匹配前一个字符出现1次或者0次，即要么有1次，要么没有</li>
<li><code>{m}</code>：表示匹配前一个字符出现m次</li>
<li><code>{m,n}</code>：表示匹配前一个字符出现从m到n次</li>
</ul>
<h4 id="42-">4.2 示例</h4>
<ul>
<li>示例1：<code>*</code>
<pre><code># 需求：匹配一个字符串第一个字母为大写字符，后面都是小写字母并且这些小写字母可有可无
import re

ret = re.match(&quot;[A-Z][a-z]*&quot;,&quot;M&quot;)
print(ret.group())

ret = re.match(&quot;[A-Z][a-z]*&quot;,&quot;MnnM&quot;)
print(ret.group())

ret = re.match(&quot;[A-Z][a-z]*&quot;,&quot;Aabcdef&quot;)
print(ret.group())
  
# 运行结果：
M
Mnn
Aabcdef
</code></pre></li>
<li>示例2：<code>+</code>
<pre><code># 需求：匹配一个字符串，第一个字符是t，最后一个字符是o，中间至少有一个字符
import re

match_obj = re.match(&quot;t.+o&quot;, &quot;two&quot;)
if match_obj:
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
  
# 运行结果：
two
</code></pre></li>
<li>示例3：<code>?</code>
<pre><code># 需求：匹配出这样的数据，既可能是https，也可能是http
import re

match_obj = re.match(&quot;https?&quot;, &quot;http&quot;)
if match_obj:
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
  
# 运行结果：
https
</code></pre></li>
<li>示例4：<code>{m}、{m,n}</code>
<pre><code># 需求：匹配出8到20位的密码，可以是大小写英文字母、数字、下划线
import re


ret = re.match(&quot;[a-zA-Z0-9_]{6}&quot;,&quot;12a3g45678&quot;)
print(ret.group())

ret = re.match(&quot;[a-zA-Z0-9_]{8,20}&quot;,&quot;1ad12f23s34455ff66&quot;)
print(ret.group())
  
# 运行结果：
12a3g4
1ad12f23s34455ff66
</code></pre></li>
</ul>
<h2 id="5">5.匹配开头和结尾</h2>
<h4 id="51-">5.1 匹配开头和结尾</h4>
<ul>
<li><code>^</code>：表示匹配字符串开头</li>
<li>$：表示匹配字符串结尾</li>
</ul>
<h4 id="52-">5.2 示例</h4>
<ul>
<li>示例1：<code>^</code>
<pre><code># 需求：匹配以数字开头的数据
import re

# 匹配以数字开头的数据
match_obj = re.match(&quot;^\d.*&quot;, &quot;3hello&quot;)
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
3hello
</code></pre></li>
<li>示例2：$
<pre><code># 需求：匹配以数字结尾的数据
import re
# 匹配以数字结尾的数据
match_obj = re.match(&quot;.*\d$&quot;, &quot;hello5&quot;)
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
hello5
</code></pre></li>
<li>示例3：^和$
<pre><code># 需求：匹配以数字开头中间内容不管以数字结尾
import re
  
  
match_obj = re.match(&quot;^\d.*\d$&quot;, &quot;4hello4&quot;)
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
  
</code></pre></li>
</ul>
<h4 id="53-">5.3 除了指定字符以外都匹配</h4>
<ul>
<li>[^指定字符]：表示除了指定字符都匹配
<pre><code># 需求：第一个字符除了aeiou的字符都匹配
import re
  
match_obj = re.match(&quot;[^aeiou]&quot;, &quot;h&quot;)
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
h
</code></pre></li>
</ul>
<h2 id="6">6.匹配分组</h2>
<h4 id="61-">6.1 匹配分组相关正则表达式</h4>
<ul>
<li><code>|</code>：表示匹配左右任意一个表达式</li>
<li><code>(ab)</code>：表示将括号中字符作为一个分组</li>
<li><code>\num</code>：表示引用分组num匹配到的字符串</li>
<li><code>(?p&lt;name&gt;)</code>：表示分组起别名</li>
<li><code>(?P=name)</code>：表示引用别名为name分组匹配到的字符串</li>
<li><code>(分组数据)</code>：分组数是从左到右的方式进行分配的，最左边的是第一个分组，依次类推</li>
</ul>
<h4 id="62-">6.2 示例</h4>
<ul>
<li>示例1：<code>|</code>
<pre><code># 需求：在列表中['apple','banana','orange','pear'],匹配apple和pear
import re
#水果列表
fruit_list = ['apple','banana','orange','pear']
  
# 遍历数据
for value in fruit_list:
    # |    匹配左右任意一个表达式
    match_obj = re.match(&quot;apple|pear&quot;, value)
    if match_obj:
        print(&quot;%s是我想要的&quot; % match_obj.group())
    else:
        print(&quot;%s不是我要的&quot; % value)
  
  
# 运行结果：
apple是我想要的
banana不是我要的
orange不是我要的
pear是我想要的
</code></pre></li>
<li>示例2：<code>()</code>
<pre><code># 需求：匹配出163、126、qq等邮箱
import re

match_obj = re.match(&quot;[a-zA-Z0-9_]{4,20}@(163|126|qq|sina|yahoo)\.com&quot;, &quot;hello@163.com&quot;)
if match_obj:
    print(match_obj.group())
    # 获取分组数据
    print(match_obj.group(1))
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
hello@163.com
163
</code></pre><pre><code># 需求：匹配qq：12345这样的数据，提取出qq文字和数字
import re

match_obj = re.match(&quot;(qq):([1-9]\d{4,10})&quot;, &quot;qq:12345&quot;)

if match_obj:
    print(match_obj.group())
    # 分组:默认是1一个分组，多个分组从左到右依次加1
    print(match_obj.group(1))
    # 提取第二个分组数据
    print(match_obj.group(2))
else:
    print(&quot;匹配失败&quot;)
      
# 运行结果：
qq
12345
</code></pre></li>
<li>示例3：<code>\num</code>
<pre><code># 需求：匹配出&lt;html&gt;hh&lt;/html &gt;
match_obj = re.match(&quot;&lt;[a-zA-Z1-6]+&gt;.*&lt;/[a-zA-Z1-6]+&gt;&quot;, &quot;&lt;html&gt;hh&lt;/div&gt;&quot;)

if match_obj:
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)

match_obj = re.match(&quot;&lt;([a-zA-Z1-6]+)&gt;.*&lt;/\\1&gt;&quot;, &quot;&lt;html&gt;hh&lt;/html&gt;&quot;)

if match_obj:
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
      
      
# 运行结果：
&lt;html&gt;hh&lt;/div&gt;
&lt;html&gt;hh&lt;/html&gt;
</code></pre></li>
<li>示例4：<code>(?P&lt;name&gt;)</code>、<code>(?P=name)</code>
<pre><code># 需求：匹配出&lt;html&gt;&lt;h1&gt;www.baidu.com&lt;/h1&gt;&lt;/html&gt;
import re
  
match_obj = re.match(&quot;&lt;(?P&lt;name1&gt;[a-zA-Z1-6]+)&gt;&lt;(?P&lt;name2&gt;[a-zA-Z1-6]+)&gt;.*&lt;/(?P=name2)&gt;&lt;/(?P=name1)&gt;&quot;, &quot;&lt;html&gt;&lt;h1&gt;www.baidu.com&lt;/h1&gt;&lt;/html&gt;&quot;)

if match_obj:
    print(match_obj.group())
else:
    print(&quot;匹配失败&quot;)
      
      
# 运行结果：
&lt;html&gt;&lt;h1&gt;www.baidu.com&lt;/h1&gt;&lt;/html&gt;
</code></pre></li>
</ul>

    </div>
    <div class="post-footer">
      
    </div>
  </article>

    </main>
  </body>
</html>
